home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / dev / c / cflow.lha / cflow-2.0 / cflow.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  1999-02-20  |  4KB  |  288 lines

  1. #! @CFLOW_SHELL@
  2.  
  3. # cflow - print a function call hierarchy
  4. # This script is contributed to the public domain by Andrew Moore
  5. # of Talke Studio.
  6.  
  7. # exit on errors..
  8.  
  9. # this values can be overriden by devining them in the
  10. # enviornment
  11. F2C=${F2C:=f2c}
  12. LEX=${LEX:=flex}
  13. YACC={YACC:="bison -y"}
  14. CC=${CC:=gcc}
  15. CPP=${CPP:="$CC -E"}
  16. PRCC=${PRCC:=@PRCC@}
  17. PRCG=${PRCG:=@PRCG@}
  18. TMPFILE=/tmp/cflow.$$
  19.  
  20.  
  21. function prcc {
  22.     if [ $verbose ]; then
  23.         echo $PRCC $* >/dev/tty
  24.     fi
  25.         
  26.     command $PRCC $*
  27. }
  28.  
  29. function prcg {
  30.  
  31.     if [ $verbose ]; then
  32.         echo $PRCG $* >/dev/tty
  33.     fi
  34.     command $PRCG $*
  35. }
  36.  
  37. function echo {
  38.     builtin echo -e "$*" 
  39. }
  40.  
  41.  
  42. # test for dos...
  43. if [ X$OSMODE != X ]; then
  44.     swap extend
  45.     echo=echo
  46. else
  47.     echo="builtin echo -e"
  48.      trap 'remove_tmp_file ; remove_exclude_files; exit '  1 2 15
  49. fi
  50.  
  51. progname=$0
  52.  
  53. function usage
  54. {
  55.     echo $progname [-AaginPXVvxh] [-d n] [-w n] [-r name] [cpp-opts] files
  56.     echo "\t-a\tprint a seperate cal graph for each function"
  57.     echo "\t-A\teliminate ansi keywords"
  58.     echo "\t-P\teliminate posix keywords"
  59.     echo "\t-d n\tprint call graph to depth n"
  60.     echo "\t-g\teliminate gcc keywords"
  61.     echo "\t-r name\\tstart tree at name"
  62.     echo "\t-D and -I options "
  63.     echo "\t-x\tprint each subgraph in full"
  64.     echo "\t-i\tinverted index"
  65.     echo "\t-s\tsave temporary files"
  66.     echo "\t-n\tdon't run prcg (useful for debugging)"
  67.     echo 
  68.     echo "\t-v\tinclude variables"
  69.     echo "\t-X\texclude files "
  70.     echo "\t-V\tverbose"
  71.     echo "\nAccepts the following from the environment"
  72.     echo "\tCPP (default $CPP)"
  73.     echo "\tCC  (default $CC)"
  74.     echo "\tPRCG (default $PRCG)"    
  75.     echo "\tPRCC (default $PRCC)"
  76.     exit 1
  77. }
  78.  
  79.  
  80.  
  81. invert=""
  82. verbose=""
  83. exclude_files=""
  84. exclude_directory=/tmp/cflow.excludes
  85. if [ -z "$OSMODE" ]; then
  86.     exclude_directory="$exclude_directory".$$
  87. fi
  88.  
  89. function do_mkdir 
  90. {
  91.     for i in $*
  92.     do
  93.         mkdir -p $i
  94.         if [ $? -ne 0 ]; then
  95.             echo "can't make $i; exiting"
  96.             exit 1
  97.         fi
  98.     done
  99. }
  100.  
  101. function remove_exclude_files
  102. {
  103.     if [ -d $exclude_directory ]; then
  104.         rm -rf $exclude_directory
  105.     fi
  106.  
  107.  
  108. function remove_tmp_file
  109. {
  110.     if [ "$save_temps" ] ; then
  111.         echo temp file in  $TMPFILE
  112.     else
  113.         rm $TMPFILE
  114.     fi
  115. }
  116.  
  117. # call this once when we get are include files
  118. # called only if we want to exclude files
  119. function exclude 
  120. {
  121.     if [ "$exclude_files" ]; then
  122.         do_mkdir $exclude_directory
  123.     fi
  124.  
  125.     for i in $exclude_files
  126.     do
  127.         case $i in 
  128.             */* )
  129.                 echo "can't make subdirectory $i yet"
  130.                 continue
  131.                 ;;
  132.         esac
  133.         >$exclude_directory/$i
  134.  
  135.     done        
  136. }
  137.  
  138. #builtin -d echo     # use gnu echo
  139.  
  140. #  echo command line is $* >& 2
  141. while getopts aghsAPD:I:X:nU:d:ir:Vvw:x c; do
  142. #    echo option is $c
  143. #    echo OPTARG = $OPTARG
  144.     case $c in
  145.     D)
  146.         CPP="$CPP -D$OPTARG"
  147.         ;;
  148.     I)
  149.         CPP="$CPP -I$OPTARG"
  150.         ;;
  151.     U)
  152.         CPP="$CPP -U$OPTARG"
  153.         ;;
  154.     a)
  155.         PRCG="$PRCG -a"
  156.         ;;
  157.     n)
  158.         no_prcg="true"
  159.         ;;
  160.     V)
  161.         verbose=1
  162.         ;;
  163.     d)
  164.         PRCG="$PRCG -d$OPTARG"
  165.         ;;
  166.     g)    
  167.         PRCC="$PRCC -g"
  168.         ;;
  169.     P)
  170.         PRCC="$PRCC -p"
  171.         ;;
  172.     A)
  173.         PRCC="$PRCC -a"
  174.         ;;
  175.     i)
  176.         PRCG="$PRCG -i"
  177.         invert=1
  178.         ;;
  179.     r)
  180.         PRCG="$PRCG -r$OPTARG"
  181.         ;;
  182.     v)
  183.         PRCC="$PRCC -v"
  184.         ;;
  185.     w)
  186.         PRCG="$PRCG -w$OPTARG"
  187.         ;;
  188.     x)
  189.         PRCG="$PRCG -x"
  190.         ;;
  191.     s)
  192.         save_temps=1
  193.         ;;
  194.     X)    
  195.         exclude_files="$exclude_files $OPTARG"
  196.         ;;
  197.     \? | h)
  198.         usage >&2
  199.         exit 2
  200.         ;;
  201.     esac
  202. done
  203.  
  204. if [ "$exclude_files" ]; then
  205.     exclude
  206.     CPP="$CPP -I$exclude_directory" 
  207.  
  208. fi
  209.  
  210.  
  211.  
  212.  
  213. let count=$OPTIND-1
  214. shift $count
  215. unset count
  216.  
  217. if [ $# -eq 0 ]; then
  218.     usage
  219. fi
  220.  
  221. for c in $*
  222. do
  223.     case $c in
  224.     *.c|*.cc|*.C)
  225.         cname=$c
  226.         ;;
  227.     *.f)
  228.         cname=`basename $c .f`.c
  229.         cat $c | $F2C >$cname
  230.         ;;
  231.     *.F)
  232.         cname=`basename $c .F`.C
  233.         cat $c | $F2C >$cname
  234.         ;;
  235.     *.l)
  236.         cname=`basename $c .l`.c
  237.         $LEX $c
  238.         sed '/# line/d' lex.yy.c >$cname
  239.         ;;
  240.     *.y)
  241.         cname=`basename $c .y`.c
  242.         $YACC $c
  243.         sed '/# line/d' y.tab.c >$cname
  244.         ;;
  245.     *.s)
  246.         echo "cflow: assembler source not supported" >&2
  247.         shift
  248.         [ $# -le 0 ] && break
  249.         c=$1
  250.         continue
  251.         ;;
  252.     *.h)
  253.         shift
  254.         [ $# -le 0 ] && break
  255.         c=$1
  256.         continue
  257.         ;;
  258.     *)    
  259.         usage >&2
  260.         exit 2
  261.         ;;
  262.     esac
  263.     if [ $verbose ]; then
  264.         echo $CPP $cname >& 2
  265.     fi
  266.  
  267.     $CPP $cname  >>$TMPFILE
  268. done
  269.  
  270. if [ "$no_prcg" ]; then
  271.     PRCG=cat
  272. fi
  273.  
  274.  
  275. if [ X$invert = X ]; then
  276.  prcc < $TMPFILE | prcg 
  277. else
  278.     prcc < $TMPFILE |
  279.     sed 's/\(.*    \)\(.*    \)/\2\1/' |
  280.     sort +0 -1 +2 |
  281.     uniq |
  282.     prcg    
  283. fi
  284.  
  285. remove_tmp_file
  286. remove_exclude_files
  287.